package com.artisan.springuitls.demos;

import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * ResourceUtils 工具类演示
 * 功能：资源路径解析器
 * 优势：自动识别 classpath:、file: 等协议，避免硬编码路径
 * 
 * ⚠️ 重要提醒：生产环境建议使用 ResourceLoader，此工具在 Fat JAR 中可能失效
 */
@Component
public class ResourceUtilsDemo {

    /**
     * 场景：读取 classpath 下的资源文件
     */
    public void loadResource() {
        System.out.println("\n========== ResourceUtils Demo ==========");
        
        try {
            // ✅ 自动解析 classpath 协议
            File propFile = ResourceUtils.getFile("classpath:application.properties");
            System.out.println("✓ 配置文件路径: " + propFile.getAbsolutePath());
            System.out.println("✓ 文件是否存在: " + propFile.exists());
            System.out.println("✓ 文件大小: " + propFile.length() + " bytes");
        } catch (FileNotFoundException e) {
            System.err.println("✗ 文件未找到: " + e.getMessage());
        }
    }

    /**
     * 演示更多协议支持
     */
    public void demonstrateProtocols() {
        System.out.println("\n--- 各种协议解析 ---");
        
        // 1. classpath 协议
        try {
            File classpathFile = ResourceUtils.getFile("classpath:application.properties");
            System.out.println("✓ classpath 协议: " + classpathFile.getAbsolutePath());
        } catch (FileNotFoundException e) {
            System.err.println("✗ classpath 文件未找到");
        }
        
        // 2. file 协议
        try {
            String tmpDir = System.getProperty("java.io.tmpdir");
            File fileProtocol = ResourceUtils.getFile("file:" + tmpDir);
            System.out.println("✓ file 协议: " + fileProtocol.getAbsolutePath());
        } catch (FileNotFoundException e) {
            System.err.println("✗ file 路径无效");
        }
        
        // 3. 判断是否为 URL
        System.out.println("✓ 是否为 URL (http://...): " + ResourceUtils.isUrl("http://example.com"));
        System.out.println("✓ 是否为 URL (classpath:...): " + ResourceUtils.isUrl("classpath:test.txt"));
        System.out.println("✓ 是否为 URL (普通路径): " + ResourceUtils.isUrl("/tmp/test.txt"));
        
        // 4. 判断是否为文件协议
        try {
            System.out.println("✓ 是否为文件 URL: " + ResourceUtils.isFileURL(
                ResourceUtils.toURL("file:/tmp/test.txt")));
        } catch (Exception e) {
            System.out.println("✓ 文件 URL 检查示例");
        }
        
        // 5. 判断是否为 JAR 文件 URL
        try {
            System.out.println("✓ 是否为 JAR URL: " + ResourceUtils.isJarURL(
                ResourceUtils.toURL("jar:file:/app.jar!/config.properties")));
        } catch (Exception e) {
            System.out.println("✓ JAR URL 检查示例");
        }
        
        System.out.println("==========================================\n");
    }

    /**
     * 演示常量使用
     */
    public void demonstrateConstants() {
        System.out.println("\n--- 协议常量 ---");
        
        System.out.println("Classpath URL 前缀: " + ResourceUtils.CLASSPATH_URL_PREFIX); // classpath:
        System.out.println("File URL 前缀: " + ResourceUtils.FILE_URL_PREFIX); // file:
        System.out.println("JAR URL 前缀: " + ResourceUtils.JAR_URL_PREFIX); // jar:
        System.out.println("WAR URL 前缀: war:"); // war:
        System.out.println("JAR 文件扩展名: " + ResourceUtils.JAR_FILE_EXTENSION); // .jar
        System.out.println("WAR 文件扩展名: .war"); // .war
        
        System.out.println("==========================================\n");
    }

    /**
     * ⚠️ 演示陷阱：Fat JAR 中的限制
     */
    public void demonstrateFatJarPitfall() {
        System.out.println("\n--- Fat JAR 陷阱提醒 ---");
        
        System.out.println("⚠️ 警告：在 Spring Boot Fat JAR 中，classpath: 资源无法通过 File 访问！");
        System.out.println("⚠️ 原因：JAR 内文件不是真实文件系统路径");
        System.out.println("✅ 推荐方案：使用 ResourceLoader.getResource() 获取 Resource 对象");
        System.out.println("✅ 示例：");
        System.out.println("   @Autowired ResourceLoader resourceLoader;");
        System.out.println("   Resource resource = resourceLoader.getResource(\"classpath:config.yml\");");
        System.out.println("   InputStream is = resource.getInputStream();");
        
        System.out.println("==========================================\n");
    }
}

